home *** CD-ROM | disk | FTP | other *** search
/ IRIX Installation Tools …tallation Tools 1998 June / SGI IRIX Installation Tools 1998 June.iso / coffcheck < prev    next >
Text File  |  1998-05-26  |  8KB  |  267 lines

  1. #!/bin/ksh -p
  2. #       The flag is:
  3. #           -p privileged (skips . $ENV)
  4.  
  5. # coffcheck
  6. # Use: "coffcheck -help" for help.
  7. #
  8. # Finds COFF executable files on local file systems.
  9. # Useful when upgrading to IRIX 6.5, which no longer supports COFF.
  10. #
  11. # Best to run as root, to avoid errors due to unreadable files or directories.
  12. #
  13. # Does a "find" command over all local file systems -- could take a while
  14. # on systems with large local disk storage.
  15. #
  16. # Input:
  17. #   Your local file systems and inst history.
  18. #
  19. # Output:
  20. #   /usr/tmp/Coff.files.list:
  21. #        List of executable COFF files found on local file systems.
  22. #        (Files known to be installed using inst are intentionally
  23. #        excluded from this list -- see the next list.)
  24. #   /usr/tmp/Coff.inst_subsystems.list:
  25. #        List of inst subsystems that contain one more currently
  26. #        installed executable COFF files.  These subsystems should
  27. #        be removed or upgraded when IRIX 6.5 is installed.
  28. #   /usr/tmp/Coff.files+libs.list:
  29. #        Same as Coff.files.list, but includes the shared libs each uses.
  30. #        inst'ed subsystems are excluded.
  31. #   /usr/tmp/Coff.libs.list:
  32. #        Sorted list of all COFF shared libraries referenced by files
  33. #        in Coff.files.list. inst'ed subsystems are excluded.
  34. #   /usr/tmp/Coff.errs:
  35. #        Error output produced by this script's internals.
  36. #
  37. #   The above files are not produced if their output would be empty.
  38.  
  39.  
  40. #########
  41. # Step 1:
  42. #   Establish a safe environment and temporary workarea in /usr/tmp/coffcheck.$$
  43.  
  44. export TMPDIR=${TMPDIR:=/usr/tmp}
  45. export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/bsd:/etc:/usr/etc
  46.  
  47. # Where output list and errors go, if not empty.
  48.  
  49. coff_file_list=$TMPDIR/Coff.files.list
  50. coff_subsys_list=$TMPDIR/Coff.inst_subsystems.list
  51. errlist=$TMPDIR/Coff.errs
  52.  
  53. if [ $# -gt 0 ] # help
  54. then echo '
  55. This command accepts no options.  It checks all files on your
  56. local filesystems for COFF executable programs.  This is the
  57. object file format from IRIX 4.0.5 and earlier releases.
  58. These programs will no longer execute under IRIX 6.2 and later
  59. IRIX releases.
  60.  
  61. This program will create two output files, containing a list of
  62. subsystems installed with "inst" that contain COFF executables
  63. (so you know which subsystems must be upgraded to be fully
  64. functional under IRIX 6.5 ), and also a list of COFF executables
  65. on your system that do not appear to have been installed by
  66. "inst".  Such programs are either locally built, copied from
  67. other systems, or part of third party packages.  You will need to
  68. build or otherwise get replacements for these programs, if you
  69. will need the functions that they provide, once you have upgraded
  70. to IRIX 6.5.  The default names of these output files are
  71. '$coff_subsys_list and $coff_file_list',
  72. respectively.
  73.  
  74. If you are currently running irix 4.0.x, almost all substems
  75. installed by "inst" will be listed.  A few subsystems shipped
  76. with IRIX 5 and IRIX 6.0.1 and 6.1 still contain COFF executables
  77. also.
  78. '
  79. exit 0
  80. fi
  81.  
  82. if test ! -w /etc/passwd
  83. then
  84.     echo You do not appear to be running this as super user.
  85.     echo Some errors may occur due to unreadable files or directories as a result.\\n
  86. fi
  87.  
  88. tmpdir=$TMPDIR/coffcheck.$$
  89. exitval=1
  90. trap 'cd /; exec 2>&1; fuser -kq $tmpdir $tmpdir/coffcheck.errs; rm -fr $tmpdir; trap 0; exit $exitval' 0 1 2 3 15
  91. mkdir $tmpdir
  92.  
  93. cd $tmpdir    # Create tmp files in this temporary directory
  94.  
  95. exec 2>coffcheck.errs
  96.  
  97. #########
  98. # Step 2:
  99. #   If someone under a different uid has already run this script,
  100. #   we won't be able to write the output files -- add a unique
  101. #   numeric suffix so we can write them:
  102.  
  103. mkunique()
  104. {
  105.     (rm -f $1; ls -ld $1) 1>&- 2>&- || {
  106.     eval $2=$1
  107.     return
  108.     }
  109.  
  110.     n=1
  111.     while (rm -f $1.$n; ls -ld $1.$n) 1>&- 2>&-
  112.     do
  113.     let n=n+1
  114.     done
  115.     eval $2=$1.$n
  116. }
  117.  
  118. mkunique $coff_file_list coff_file_list
  119. mkunique $coff_subsys_list coff_subsys_list
  120. mkunique $errlist errlist
  121.  
  122. #########
  123. # Step 3:
  124. #   Find all COFF files on local file systems.
  125.  
  126. echo Searching local filesystems for COFF executable files ... '\c'
  127.  
  128. # anything in the /stand and /usr/stand dirs are ommitted, as some of these
  129. # must remain COFF on many systems in order for the PROM to be able to execute
  130. # them.  Similarly with /unix*
  131. # the first sed is in case filenames have embedded spaces or tabs
  132. find / -local -type f \( -perm -100 -o -perm -10 -o -perm -1 \) -print |
  133.     sed 's/[     ]/\\&/g' |
  134.     xargs file |
  135.     egrep 'MIPSEB.*COFF|    mipseb ' |
  136.     sed -e 's/:    .*//' -e '/^\/stand\//d' -e '/^\/usr\/stand/d' -e '/^\/unix/d' |
  137.     sort -u > find.list
  138.  
  139. # The printer GUI files often come in both COFF and ELF forms,
  140. # so IRIX 4 systems can use them also (clients copy them from the
  141. # server).
  142. if grep /var/spool/lp/gui_model find.list > lpgui.list
  143. then # found some lp gui files, don't complain about coff equivalents
  144.     # if ELF versions installed
  145.     sed 's,gui_model/,&ELF/,' lpgui.list | ( while read elf rest; do
  146.         if [ -x "$elf" ]; then echo $elf >> lpgui.elf;
  147.         fi
  148.         done )
  149.     sed s,/ELF/,/, lpgui.elf > lpgui.rem
  150.     if [ -s lpgui.rem ]; then
  151.         fgrep -f lpgui.rem -v find.list > find.nlist && \
  152.             mv find.nlist find.list
  153.     fi
  154. fi
  155.  
  156. echo '\n'Preparing results ... '\c'
  157.  
  158. #########
  159. # Step 4:
  160. #   Compile realpath - used to canonicalize 'versions long' output pathnames.
  161. #   If unable to compile, realpath defaults to a no-op command.
  162. #   A second field is expected on each line, and passed through unchanged.
  163.  
  164. export TOOLROOT=/
  165. [ -d /usr/sysgen/root/usr/bin ] && TOOLROOT=/usr/sysgen/root
  166. [ -d /usr/cpu/sysgen/root/usr/bin ] && TOOLROOT=/usr/cpu/sysgen/root
  167.  
  168. PATH=$TOOLROOT/usr/bin:$PATH
  169.  
  170. cat <<!! > realpath.c
  171.     char buf1[1024], buf2[1024], buf3[1024], buf4[1024];
  172.  
  173.     /*
  174.      * input: two fields per line (1) pathname, (2) string (inst subsys)
  175.      * output: two fields per line (1) realpath of pathname, (2) same string
  176.      */
  177.  
  178.     main()
  179.     {
  180.     while (gets (buf1) != 0) {
  181.         sscanf (buf1, "%s %s", buf2, buf3);
  182.         realpath (buf2, buf4);
  183.         printf ("%s %s\n", buf4, buf3);
  184.     }
  185.     return 0;
  186.     }
  187. !!
  188.  
  189. cc -o realpath realpath.c 2>/dev/null || echo cat > realpath
  190. chmod +x realpath
  191.  
  192. #########
  193. # Step 5:
  194. #   Obtain list of inst'd files from "versions long".
  195. #   Canonicalize these pathnames using realpath.
  196. #   Feed that stream to two command pipes (via two named pipes).
  197. #   The two command pipes calculate (1) the COFF files that
  198. #   weren't installed via inst, and (2) the inst subsystems
  199. #   which have one or more COFF files installed.
  200.  
  201. mknod pipe1 p        # named pipe to feed first command pipe
  202. mknod pipe2 p        # named pipe to feed second command pipe
  203.  
  204. #############
  205. # SubStep 5a:
  206. #   First command pipe.
  207. #   Calculate list of COFF files that were not inst'd.
  208.  
  209. < pipe1 awk '{print $1}' |
  210.     sort -u |
  211.     comm -23 find.list - > coff.file.list &
  212.     
  213. #############
  214. # SubStep 5b:
  215. #   Second command pipe.
  216. #   Calculate list of inst subsystems having one or more COFF files.
  217.  
  218. < pipe2 sort -u |
  219.     join -j 1 -o 1.2 - find.list |
  220.     sort -u > coff.subsys.list &
  221.  
  222. #############
  223. # SubStep 5c:
  224. #   Common source for the two command pipes.
  225. #   Obtain list of inst'd files from "versions long",
  226. #   and feed to the above two command pipes.
  227.  
  228. versions long |
  229.     awk '$1 == "f" {print "/" $NF, $4}' |
  230.     ./realpath |
  231.     tee pipe1 > pipe2
  232.  
  233. wait
  234.  
  235. #########
  236. # Step 6:
  237. #   Present results to user.
  238.  
  239. echo '\n'
  240.  
  241. if [ -s coff.file.list ]
  242. then
  243.     mv coff.file.list $coff_file_list
  244.     echo List of files that won\'t run under IRIX 6.5 is in:
  245.     echo '\t'$coff_file_list
  246. else
  247.     echo There are apparently no files on this system that won\'t run under IRIX 6.5
  248. fi
  249.  
  250. if [ -s coff.subsys.list ]
  251. then
  252.     mv coff.subsys.list $coff_subsys_list
  253.     echo List of inst subsystems containing files that won\'t run under IRIX 6.5 is in:
  254.     echo '\t'$coff_subsys_list
  255. else
  256.     echo There are no inst subsystems containing files that won\'t run under IRIX 6.5
  257. fi
  258.  
  259. if [ -s coffcheck.errs ]
  260. then
  261.     mv coffcheck.errs $errlist
  262.     echo Some errors occurred during check, they are in:
  263.     echo '\t'$errlist
  264. fi
  265.  
  266. exitval=0
  267.